/*
 * personal.c
 *
 *  Created on: May 15, 2011
 *      Author: A126872
 */
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "file_handler.h"


file_handler_t fh_open(char * fichero, int itemSize, pComparatorFunction pComparator, pIsItemEmptyFunction pIsItemEmpty, pClearItemFunction pClearItem)
{
	FILE * f = fopen(fichero, "rb+");
	if ( f == NULL ){
		f = fopen( fichero, "wb+");
		if ( f == NULL ){
			// ERROR
			return NULL;
		}
	}

	file_handler_t fh = (file_handler_t)malloc(sizeof(struct _file_) *  1);
	if ( fh == NULL ){
		fclose(f);
		return NULL;
	}

	fh->file = f;
	fh->itemSize = itemSize;
	fh->pComparator = pComparator;
	fh->pIsItemEmpty = pIsItemEmpty;
	fh->pClearItem = pClearItem;
	return fh;
}

int fh_add_item(file_handler_t file_handler, void * pItem)
{
	int firstEmptyPos = -1;
	rewind(file_handler->file);
	void * pReadItem = malloc(file_handler->itemSize);
	if ( pReadItem == NULL )
		return -1;
	do {
		int currentPos = ftell(file_handler->file);
		fread(pReadItem, file_handler->itemSize, 1, file_handler->file);
		if (feof(file_handler->file))
			break;

		if ( file_handler->pIsItemEmpty(pReadItem) && firstEmptyPos == -1 ){
			firstEmptyPos = currentPos;
		}

		if ( file_handler->pComparator(pReadItem, pItem) == 0 ){
			free(pReadItem);
			return -1;
		}
	} while( 1 );

	if ( firstEmptyPos != -1 )
		fseek(file_handler->file, firstEmptyPos, SEEK_SET);
	fwrite(pItem, file_handler->itemSize, 1, file_handler->file);
	free(pReadItem);
	return 0;
}


int fh_remove_item(file_handler_t file_handler, void * pItem )
{
	rewind(file_handler->file);
	void * pReadItem = malloc(file_handler->itemSize);
	if ( pReadItem == NULL )
		return -1;
	do {
		fread(pReadItem, file_handler->itemSize, 1, file_handler->file);
		if (feof(file_handler->file))
			break;

		if ( file_handler->pComparator(pReadItem, pItem) == 0 ){
			fseek(file_handler->file, -file_handler->itemSize, SEEK_CUR);
			file_handler->pClearItem(pReadItem);
			fwrite(pReadItem, file_handler->itemSize, 1, file_handler->file);
			free(pReadItem);
			return -1;
		}
	} while( 1 );

	free(pReadItem);
	return 0;
}

int fh_modify_item(file_handler_t file_handler, void * pItem )
{
	rewind(file_handler->file);
	void * pReadItem = malloc(file_handler->itemSize);
	if ( pReadItem == NULL )
		return -1;
	do {
		fread(pReadItem, file_handler->itemSize, 1, file_handler->file);
		if (feof(file_handler->file))
			break;

		if ( file_handler->pComparator(pReadItem, pItem) == 0 ){
			fseek(file_handler->file, -file_handler->itemSize,SEEK_CUR);
			fwrite(pItem, file_handler->itemSize, 1, file_handler->file);
			return 0;
		}

	}while( 1 );
	free(pReadItem);
	return -1;
}
//{
//	rewind(ficheroTrabajadores);
//	trabajador_t trabajador;
//	while( ! feof(ficheroTrabajadores) ){
//		fread(&trabajador, sizeof(trabajador_t), 1, ficheroTrabajadores);
//		if ( trabajador.codigo == ptrabajador->codigo ){
//			fseek(ficheroTrabajadores, -sizeof(trabajador_t),SEEK_CUR);
//			fwrite(ptrabajador, sizeof(trabajador_t), 1, ficheroTrabajadores);
//			return 0;
//		}
//	}
//	return -1;
//}


int fh_find_item(file_handler_t file_handler, void * item )
{
	return 0;
}
//int find_trabajador_by_codigo(FILE * ficheroTrabajadores, int codigo, trabajador_t * ptrabajador)
//{
//	rewind(ficheroTrabajadores);
//	trabajador_t trabajador;
//	while( ! feof(ficheroTrabajadores) ){
//		fread(&trabajador, sizeof(trabajador_t), 1, ficheroTrabajadores);
//		if ( trabajador.codigo == codigo ){
//			ptrabajador->codigo = trabajador.codigo;
//			memcpy(ptrabajador, &trabajador, sizeof(trabajador_t));
//			return 0;
//		}
//	}
//	return -1;
//}

int fh_close(file_handler_t file_handler)
{
	fclose(file_handler->file);
	return 0;
}


